package com.spzx.cart.api;

import com.spzx.cart.api.domain.CartInfo;
import com.spzx.cart.api.factory.RemoteCartFallbackFactory;
import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;

import java.util.List;

@FeignClient(
    value = ServiceNameConstants.CART_SERVICE,
    fallbackFactory = RemoteCartFallbackFactory.class)
public interface RemoteCartService
{
    /**
     * 获取已选中的购物车列表
     * 此方法用于获取从特定来源请求的已选中购物车信息列表
     * 它根据请求头中的来源信息来获取数据，旨在支持不同的客户端或系统集成
     *
     * @param source 请求来源标识，用于区分请求的来源，如不同的客户端或系统
     * @return 返回一个响应对象，包含已选中的购物车信息列表
     */
    @GetMapping("/getCartCheckedList")
    R<List<CartInfo>> getCartCheckedList(
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 更新用户购物车中商品的价格
     * 此接口根据用户的ID获取其购物车中的商品信息，并重新计算总价
     * 主要用于在商品价格变动后，同步更新用户购物车中的商品总价
     *
     * @param userId 用户ID，用于识别用户的购物车信息
     * @param source 请求来源，用于安全控制或日志记录
     * @return 返回一个布尔值，表示购物车价格是否成功更新
     */
    @GetMapping("/updateCartPrice/{userId}")
    R<Boolean> updateCartPrice(
            @PathVariable("userId") Long userId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source
    );

    /**
     * 删除用户已选中的购物车列表
     * 此接口根据用户的ID删除其购物车中已选中的商品信息
     * 主要用于在用户确认不再需要某些商品时，清理购物车中的已选商品
     *
     * @param userId 用户ID，用于识别用户的购物车信息
     * @param source 请求来源，用于安全控制或日志记录
     * @return 返回一个布尔值，表示已选中的购物车商品是否成功删除
     */
    @GetMapping("/deleteCartCheckedList/{userId}")
    R<Boolean> deleteCartCheckedList(
            @PathVariable("userId") Long userId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source
    );


}